package com.dingqb.ktdemo.oop.delegatemode

import kotlin.reflect.KProperty

// 定义包含属性委托的类
class Example {
	var p: String by Delegate()
}

// 委托的类
class Delegate {
	operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
		return "$thisRef, 这里委托了 ${property.name} 属性"
	}

	operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
		println("$thisRef 的 ${property.name} 属性赋值为 $value")
	}
}

fun main(args: Array<String>) {
	val e = Example()
	println(e);
	println(e.p)     // 访问该属性，调用 getValue() 函数
	e.p = "Runoob"   // 调用 setValue() 函数
	println(e.p)
	println(zzz)
	/*
com.dingqb.ktdemo.oop.delegatemode.Example@76fb509a
com.dingqb.ktdemo.oop.delegatemode.Example@76fb509a, 这里委托了 p 属性
com.dingqb.ktdemo.oop.delegatemode.Example@76fb509a 的 p 属性赋值为 Runoob
com.dingqb.ktdemo.oop.delegatemode.Example@76fb509a, 这里委托了 p 属性
zzz

	 **/
}

//委托
val zzz: String by lazy {
	"zzz"
}

